package main

import (
	"fmt"
	"reflect"
)

/**
1) reflect.TypeOf(变量名)，获取变量的类型，返回reflect.Type类型很多信息。
2) reflect.ValueOf(变量名)，获取变量的值，返回refect.Value类型(refect,Value是一个结构体类型),通过refect.Value，可以获取到关干该变量的很多信息
**/

type User struct {
	Name string
	Age  int
}

func main() {
	num := 100.1

	testReflect(num)

	//user := User{"张三", 18}
	//testReflect2(user)
}

// 获取变量的类型
func testReflect2(i interface{}) {
	reType := reflect.TypeOf(i)
	reVal := reflect.ValueOf(i)
	fmt.Println("reType:", reType)
	fmt.Println("reVal:", reVal)

	// ①通过 reType.Kind 获取变量的类别
	fmt.Println("reType:", reType.Kind())

	// ②通过 reVal.Kind 获取变量的类别
	fmt.Println("reVal:", reVal.Kind())

	// 通过断言获取类型
	n, flag := i.(User)
	if flag {
		fmt.Printf("类型是 : %T", n)
	}

}

// 获取变量的值
func testReflect(i interface{}) {
	reType := reflect.TypeOf(i)
	reVal := reflect.ValueOf(i)
	fmt.Println("reType:", reType)
	fmt.Println("reVal:", reVal)

	// 如果真想获取reValue的数值，要调用Int()方法:返回v持有的有符号整数

	// sum := 100 + reVal.Int() // 外部传int
	sum := 100.01 + reVal.Float()
	fmt.Println("sum:", sum)

	// reVal转为空接口
	i2 := reVal.Interface()

	n, flag := i2.(int)
	if flag {
		fmt.Println("n:", n)
	}

	switch i2.(type) {
	case int:
		fmt.Println("int")
		n2 := 10 + i2.(int)
		fmt.Println("n2:", n2)
	case float64:
		fmt.Println("float64")
		n2 := 10.1 + i2.(float64)
		fmt.Println("n2:", n2)
	default:
		fmt.Println("default")
	}

}
